﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinCourseControls
{
    public partial class FrmRichTextBox02 : Form
    {
        public FrmRichTextBox02()
        {
            InitializeComponent();
        }
        string rtfText = "";
        /// <summary>
        /// 获取按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGet_Click(object sender, EventArgs e)
        {
            string str = rtxtContent.Text;//获取富文本框文本内容，不包含图片。。。。
            rtfText = rtxtContent.Rtf;//rtf代码 - 获取文本以及图片等信息以rtf代码格式显示
            rtxtContent.Clear(); // 清空


        }

        /// <summary>
        /// 加载RTF按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLoad02_Click(object sender, EventArgs e)
        {
            MemoryStream ms = new MemoryStream(ASCIIEncoding.Default.GetBytes(rtfText)); // 加载用RTF格式保存的富文本框数据字符串
            rtxtContent.LoadFile(ms, RichTextBoxStreamType.RichText); // 加载用RTF格式保存的富文本框数据字符串
        }

        /// <summary>
        /// 加载按钮
        /// 文件加载  txt   rtf
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLoad_Click(object sender, EventArgs e)
        {
            OpenFileDialog fd = new OpenFileDialog(); // 打开文件对话框
            fd.Filter = "(*.rtf)|*.rtf|(*.txt)|*.txt"; // 设置文件格式
            if (fd.ShowDialog() == DialogResult.OK) // 打开对话框
            {
                rtxtContent.LoadFile(fd.FileName);//rtf - 加载rtf富文本文件数据
                //rtxtContent.LoadFile(fd.FileName,RichTextBoxStreamType.PlainText); //加载txt富文本文件数据
            }
        }

        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog(); // 保存文件对话框
            sfd.Filter = "(*.rtf)|*.rtf|(*.txt)|*.txt"; // 设置文件格式
            if (sfd.ShowDialog() == DialogResult.OK) // 打开对话框
            {
                rtxtContent.SaveFile(sfd.FileName);  // 保存RTF文件  RichTextBoxStreamType.RichText - 默认保存成流文本
                // rtxtContent.SaveFile(sfd.FileName,RichTextBoxStreamType.PlainText);//文本文件  RichTextBoxStreamType.PlainText（txt格式文本） 保存txt文本
            }
        }

        /// <summary>
        /// 插入图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnInsertImg_Click(object sender, EventArgs e)
        {
            OpenFileDialog fd = new OpenFileDialog();  // 打开文件对话框
            fd.Filter = "(*.png)|*.png|(*.jpg)|*.jpg"; // 设置文件格式
            if (fd.ShowDialog() == DialogResult.OK)  // 打开对话框
            {
                Clipboard.Clear(); // 先把剪切板清空
                Image img = Image.FromFile(fd.FileName); // 加载图片数据
                Clipboard.SetImage(img); // 先把图片数据暂存到剪切版中
                rtxtContent.Paste();//将剪贴板中的图片粘贴到控件中
            }
        }

        /// <summary>
        /// 文本加粗
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBold_Click(object sender, EventArgs e)
        {
            Font oldFont; // 默认字体
            Font newFont; // 新的字体
            oldFont = rtxtContent.SelectionFont; // 获取原始文本字体 - 选定文本或者光标插入点的字体  
            if (oldFont != null) // 获取到原始文本字体样式
            {
                if (oldFont.Bold)//原本是加粗---取消加粗
                {
                    newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Bold);  // oldFont.Style & ~FontStyle.Bold  语法唐 原本的样式是加粗就获取不加粗 ~（取反符号）
                }
                else //不是加粗---加粗
                {
                    newFont = new Font(oldFont, oldFont.Style | FontStyle.Bold);  // 设置字体加粗
                    //newFont = new Font(oldFont, FontStyle.Bold);  // 这样写也可以，好理解一些
                }
                rtxtContent.SelectionFont = newFont;// 设置新字体  设置选定内容或插入点的字体
                                                    // rtxtContent.Focus();
            }
            else
            {   // 解决给选中文本设置多种字体样式不生效问题
                oldFont = rtxtContent.Font;
                rtxtContent.SelectionFont = new Font(oldFont, oldFont.Style | FontStyle.Bold);
            }

        }

        /// <summary>
        /// 斜体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnItalic_Click(object sender, EventArgs e)
        {
            Font oldFont;  // 原始字体样式
            Font newFont; // 新字体样式
            oldFont = rtxtContent.SelectionFont; // 获取原始文本字体 - 选定文本或者光标插入点的字体  
            if (oldFont != null) // 获取到原始文本字体样式
            {
                if (oldFont.Italic)//原本是斜体---取消斜体
                {
                    newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Italic); // 取消斜体
                }
                else //不是斜体---斜体
                {
                    newFont = new Font(oldFont, oldFont.Style | FontStyle.Italic);  // 设置斜体
                }
                rtxtContent.SelectionFont = newFont;// 设置新字体 设置选定内容或插入点的字体
                //rtxtContent.Focus();
            }
            else
            {  // 解决给选中文本设置多种字体样式不生效问题
                oldFont = rtxtContent.Font;
                rtxtContent.SelectionFont = new Font(oldFont, oldFont.Style | FontStyle.Italic);
            }
        }

        /// <summary>
        /// 下划线按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDownLine_Click(object sender, EventArgs e)
        {
            Font oldFont;  // 原始字体样式
            Font newFont; // 新字体样式
            oldFont = rtxtContent.SelectionFont; // 获取原始文本字体 - 选定文本或者光标插入点的字体  
            if (oldFont != null) // 获取到原始文本字体样式
            {
                if (oldFont.Italic)//原本是斜体---取消斜体
                {
                    newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Underline); // 取消下划线
                }
                else //不是斜体---斜体
                {
                    newFont = new Font(oldFont, oldFont.Style | FontStyle.Underline);  // 设置下划线
                }
                rtxtContent.SelectionFont = newFont;// 设置新字体 设置选定内容或插入点的字体
                //rtxtContent.Focus();
            }
            else
            {   // 解决给选中文本设置多种字体样式不生效问题
                oldFont = rtxtContent.Font; // 获取选中前字体样式
                rtxtContent.SelectionFont = new Font(oldFont, oldFont.Style | FontStyle.Underline); // 设置选中文本样式
            }
        }

        /// <summary>
        /// 居中按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCenter_Click(object sender, EventArgs e)
        {
            if (rtxtContent.SelectionAlignment == HorizontalAlignment.Center)
            {
                rtxtContent.SelectionAlignment = HorizontalAlignment.Left; // 设置选中文本居左
            }
            else
                rtxtContent.SelectionAlignment = HorizontalAlignment.Center; // 设置选中文本居中
        }

        /// <summary>
        /// 居左按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLeft_Click(object sender, EventArgs e)
        {
            rtxtContent.SelectionAlignment = HorizontalAlignment.Left;  // 设置选中文本居左
        }

        /// <summary>
        /// 居右按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRight_Click(object sender, EventArgs e)
        {
            if (rtxtContent.SelectionAlignment == HorizontalAlignment.Center || rtxtContent.SelectionAlignment == HorizontalAlignment.Left)
            {
                rtxtContent.SelectionAlignment = HorizontalAlignment.Right; // 设置选中文本居右
            }
            else
                rtxtContent.SelectionAlignment = HorizontalAlignment.Left; // 设置选中文本居左
        }

        /// <summary>
        /// 设置字号
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSetSize_Click(object sender, EventArgs e)
        {
            ApplyTextSize(txtSize.Text); // 设置选中文本字体
            rtxtContent.Focus(); // 设置光标选中
        }

        /// <summary>
        /// 根据输入设置字号方法
        /// </summary>
        /// <param name="textSize"></param>
        private void ApplyTextSize(string textSize)
        {
            float newSize = Convert.ToSingle(textSize); // 获取字号
            FontFamily currentFontFamily; // 选中文本字体-楷体  FontFamily-字体
            Font newFont;  // 新字体样式
            if (this.rtxtContent.SelectionFont != null)  // 判断选中的字体
            {
                currentFontFamily = this.rtxtContent.SelectionFont.FontFamily; // 获取选中文本字体
                //currentFontFamily = new FontFamily("楷体");
                newFont = new Font(currentFontFamily, newSize); // 设置新字体大小
                this.rtxtContent.SelectionFont = newFont; // 设置新字体样式
            }
        }

        private void FrmRichTextBox02_Load(object sender, EventArgs e)
        {
            rtxtContent.AutoWordSelection = true;
        }
    }
}
